#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Author: lonewolf
# Date: 2013-09-25 09:58:52
#
import re
import os
import shutil
import json
import time

srcPath="apistr"

snippetTemplate = """<snippet>
    <content><![CDATA[$content]]></content>
    <tabTrigger>$trigger</tabTrigger>
    <scope>source.python</scope>
    <description>$desc</description>
</snippet>
"""

# 保存的目录
SAVE_DIR="python27_api"

def parseDir(dir):
    for item in os.listdir(dir):
        path=os.path.join(dir,item)
        parseFile(path,SAVE_DIR)

def parseFile(file,saveDir):
    filename=os.path.split(file)[1]
    filename=os.path.splitext(filename)[0]
    # 要保存到的路径
    saveDir=os.path.join(saveDir,filename)
    # 模块名
    module=""
    # 类名
    classname=""
    # 是否静态变量
    isStatic=False
    f=open(file,"r")
    while True:
        line=f.readline()
        if line:
            # 特殊处理类
            if filename=="built_in_exceptions":
                m=re.match("^\W*(\w+)",line)
                if m:
                    handleProp(saveDir,"","",m.group(1))
                continue                
            # 是否静态变量
            m=re.match("^\s*class\s+variables",line)
            if m:
                isStatic=True
                continue
            # 模块
            m=re.match("^\s*module\s+(\w+\.?\w*)",line)
            if m:
                handleProp(saveDir,"","",m.group(1))
                module=m.group(1)
                continue
            # 类
            m=re.match("^\s*class\s+(\w+)\.(\w+)\s*\((.*)\)",line)
            if m:
                module=m.group(1)
                classname=m.group(2)
                # print(classname)
                handleFunction(saveDir,module,classname,classname,m.group(3))
                # handleProp(saveDir,fullname,fullname)
                continue
            # 只起到声明的类
            m=re.match("^\s*class\s+(\w+)\.(\w+)",line)
            if m:
                module=m.group(1)
                classname=m.group(2)
                continue
            # 类实例方法
            m=re.match("^\s*%s\.(\w+)\s*\((.*)\)"%(classname),line)
            if m:
                handleFunction(saveDir,module,classname,m.group(1),m.group(2))
                continue
            # 模块函数
            m=re.match("^\s*%s\.(\w+)\s*\((.*)\)"%(module),line)
            if m:
                handleFunction(saveDir,module,"",m.group(1),m.group(2))
                continue
            # 全局函数
            m=re.match("^\s*(\w+\.?\w*)\s*\((.*)\)",line)
            if m:
                handleFunction(saveDir,module,classname,m.group(1),m.group(2))
                continue
            # 类实例变量
            m=re.match("^\s*%s\.(\w+)"%(classname),line)
            if m:
                handleProp(saveDir,module,classname,m.group(1))
                continue
            # 模块变量
            m=re.match("^\s*%s\.(\w+)"%(module),line)
            if m:
                handleProp(saveDir,module,"",m.group(1))
                continue
            # 普通变量或关键字
            m=re.match("^\s*(\w+\.?\w*)",line)
            if m:
                name=m.group(1)
                if isStatic:
                    name=classname+"."+name
                handleProp(saveDir,module,"",name)
                continue
        else:
            break
    f.close()

# 处理方法,生成snappit文件
# classname==funcName 则说明是类
def handleFunction(saveDir,module,classname,funcName,params):
    arr=handleParams(params)
    desc="."
    funcName1=funcName
    # 是否是类定义
    isClassDefy=False
    if classname==funcName:
        isClassDefy=True
    if classname!="":
        # 是类
        desc=classname
        # 类定义
        if isClassDefy:
            funcName1=module+"."+funcName
    elif module!="":
        # 是模块
        funcName1=module+"."+funcName
    content=funcName1+"(%s)"%(arr[1])
    trigger=funcName1+"(%s)"%(arr[0])
    template=snippetTemplate.replace("$content",content)
    template=template.replace("$trigger",trigger)
    template=template.replace("$desc",desc)
    # 文件名
    a=""
    if arr[0]!="":
        args=arr[0].split(",")
        for i in range(0,len(args)):
            args[i]=re.sub("\W","",args[i])
        a="_".join(args)
        a="_"+a
    saveName=funcName+a+".sublime-snippet"
    # if isClassDefy:
    #     saveName=saveName
    # else:
    #     saveName=funcName1+saveName
    # 建立类对应的目录
    if classname!="":
        saveDir=os.path.join(saveDir,classname)
    if not os.path.exists(saveDir):
        os.makedirs(saveDir)
    # 是类定义
    if isClassDefy:
        saveName="Class_"+saveName
        handleProp(saveDir,module,"",classname)
    savePath=os.path.join(saveDir,saveName)
    f=open(savePath, "w+")
    f.write(template)
    f.close()

# 处理属性,生成snappit文件
def handleProp(saveDir,module,classname,propName):
    desc="."
    propName1=propName
    if classname!="":
        desc=classname
    elif module!="":
        propName1=module+"."+propName
    content=propName1
    trigger=propName1
    template=snippetTemplate.replace("$content",content)
    template=template.replace("$trigger",trigger)
    template=template.replace("$desc",desc)
    # 文件名
    saveName=propName+".sublime-snippet"
    # print saveName
    # 建立类对应的目录
    if classname!="":
        saveDir=os.path.join(saveDir,classname)    
    if not os.path.exists(saveDir):
        os.makedirs(saveDir)
    savePath=os.path.join(saveDir,saveName)
    f=open(savePath, "w+")
    f.write(template)
    f.close()

# 处理函数变量
def handleParams(params):
    args=[]
    for item in params.split(","):
        # 去掉=号后面的
        str1=re.sub("\W","",item.split("=")[0])
        if str1!="":
            args.append(str1)
    args2=[]
    for i in range(0,len(args)):
        args2.append("${%d:%s}"%(i+1,args[i]))
    a1=""
    a2=""
    if len(args)>0:
        a1=", ".join(args)
        a2=", ".join(args2)
    return [a1,a2]


# 先删除保存目录下的文件，但不删除保存目录root
def deleteFiles(path,root):
    if os.path.isfile(path):
        try:
            os.remove(path)
        except Exception, e:
            pass
    elif os.path.isdir(path):
        for item in os.listdir(path):
            itemsrc=os.path.join(path,item)
            deleteFiles(itemsrc,root)
        if path!=root:
            try:
                os.rmdir(path)
            except Exception, e:
                pass

deleteFiles(SAVE_DIR,SAVE_DIR)
parseDir(srcPath)
